package com.taiyi.renaissancemall.base;

import android.Manifest;
import android.annotation.SuppressLint;


import android.app.Activity;
import android.os.Bundle;

import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.gyf.barlibrary.ImmersionBar;
import com.gyf.barlibrary.KeyboardPatch;
import com.lzy.okgo.OkGo;
import com.taiyi.renaissancemall.R;
import com.taiyi.renaissancemall.Utils.ActivityUtils;
import com.taiyi.renaissancemall.Utils.KeyBoardUtil;
import com.taiyi.renaissancemall.Utils.ShowDialog;
import com.taiyi.renaissancemall.Utils.ToastUtils;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionListener;


import java.util.List;

import butterknife.ButterKnife;

/**
 * Created by NGK on 2020/4/23.
 */

public abstract class BaseActivity<V, P extends BasePresent<V>> extends AppCompatActivity implements BaseView {

    protected P presenter;
    protected Activity activity;
    protected ImmersionBar mImmersionBar;

//    @Override
//    protected void attachBaseContext(Context newBase) {
//        super.attachBaseContext(LocalManageUtil.setLocal(newBase));
//    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
//        ThemeUtil.setTheme(this);
        super.onCreate(savedInstanceState);
        activity = this;
        // 添加Activity到堆栈
        AppManager.getAppManager().addActivity(activity);
        if (getLayoutId() != 0) {
//            //让布局向上移来显示软键盘
//            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
            setContentView(getLayoutId());
            presenter = initPresenter();
            presenter.attach((V) activity);
            initBind();
            initViews(savedInstanceState);

            initEvent();
        }

        //初始化沉浸式
        if (isImmersionBarEnabled()) {
            initImmersionBar();
        }

        initPermission();

    }

    protected abstract int getLayoutId();

    public abstract P initPresenter();

    protected void initBind() {
        ButterKnife.bind(activity);
    }

    protected abstract void initViews(Bundle savedInstanceState);

    protected abstract void initData();

    public abstract void initEvent();

    /**
     * 是否可以使用沉浸式
     *
     * @return the boolean
     */
    protected boolean isImmersionBarEnabled() {
        return true;
    }

    @SuppressLint("ResourceAsColor")
    protected void initImmersionBar() {
        mImmersionBar = ImmersionBar.with(this);
//        TextView textView = getId(R.id.tv_title);
//        if (!activity.getLocalClassName().contains("Vote")) {
//            if (textView != null) {
//                if (textView.getCurrentTextColor() == -1) {
//                    mImmersionBar.fitsSystemWindows(true).statusBarColor(R.color.black_box_color);
//                    mImmersionBar.statusBarDarkFont(false, 0.2f);
//                } else {
//                    mImmersionBar.fitsSystemWindows(true).statusBarColor(R.color.white);
        mImmersionBar.statusBarDarkFont(true, 0.2f);
//                }
//            }
//        } else {
//            mImmersionBar.fitsSystemWindows(true).statusBarColor(R.color.black);
//            mImmersionBar.statusBarDarkFont(false, 0.2f);
//        }

//        mImmersionBar.keyboardEnable(true); //解决软键盘与底部输入框冲突问题;
        KeyboardPatch.patch(this).enable();
        mImmersionBar.init();
    }

    protected <T extends View> T getId(int id) {
        return (T) findViewById(id);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        OkGo.getInstance().cancelTag(activity);
        // 关闭堆栈中的Activity
        AppManager.getAppManager().finishActivity(activity);


        //在onDestroy()生命周期中释放P中引用的V。
        presenter.detach();
        //在onDestroy()生命周期中取消所有子线程里面的网络连接。

        if (mImmersionBar != null) {
            mImmersionBar.destroy();  //在BaseActivity里销毁
        }

    }

    @Override
    protected void onStop() {
        super.onStop();
        hideProgress();
    }

    @Override
    public void showProgress() {
        ShowDialog.showDialog(this, "", false, null);
    }

    @Override
    public void hideProgress() {
        ShowDialog.dissmiss();
    }

    @Override
    public void toast(CharSequence s) {
        ToastUtils.showShortToast(s);
    }

    @Override
    public void showNullLayout() {

    }

    @Override
    public void hideNullLayout() {

    }

    @Override
    public void showErrorLayout() {
      /*  getId(R.id.error_text).setVisibility(View.VISIBLE);
        getId(R.id.error_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initData();
            }
        });*/
    }
    /* *
     * 设置title
     *
     * @param title 文本*/

    @Override
    public void hideErrorLayout() {
        // getId(R.id.error_text).setVisibility(View.GONE);
    }


//    /**
//     * 设置左侧返回按钮
//     */
//    protected void setLeftImg() {
//        getId(R.id.iv_back).setVisibility(View.GONE);
//    }
//
//    protected void setCenterTitle(String title) {
//        if (title == null) {
//            return;
//        }
//        TextView tvTitle = getId(R.id.tv_title);
//        ImageView tvTitle1 = getId(R.id.iv_back);
//        tvTitle.setVisibility(View.VISIBLE);
//        tvTitle.setText(title);
//        goBack();
//        if (!activity.getLocalClassName().contains("Vote")) {
//            tvTitle1.setImageResource(R.mipmap.white_back);
//            setRightImg(false, 0);
//
//        }
//
//    }
//    /* *
//     * 设置返回按钮事件*/
//
//    protected void goBack() {
//
//        getId(R.id.iv_back).setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                KeyBoardUtil.getInstance(activity).hide();
//                ActivityUtils.goBack(activity);
//            }
//        });
//    }

//    /**
//     * 设置右侧文本
//     *
//     * @param title        文字
//     * @param isVisibility 是否显示
//     */
//
//    protected void setRightTitle(String title, Boolean isVisibility) {
//        if (title == null) {
//            return;
//        }
//        TextView tvTitle = getId(R.id.tv_right_text);
//        tvTitle.setText(title);
//        if (isVisibility == true) {
//            tvTitle.setVisibility(View.VISIBLE);
//        } else {
//            tvTitle.setVisibility(View.GONE);
//        }
//    }
//
//    /**
//     * 设置右侧
//     *
//     * @param isVisibility 是否显示
//     */
//
//    protected void setRightImg(Boolean isVisibility, int pic) {
//        ImageView rightImg = getId(R.id.img_right);
//        if (isVisibility == true) {
//            rightImg.setVisibility(View.VISIBLE);
//        } else {
//            rightImg.setVisibility(View.GONE);
//        }
//        if (pic != 0) {
//            rightImg.setImageResource(pic);
//        }
//    }
//
//    protected void setLeftImg(int pic) {
//        ImageView iv_back = getId(R.id.iv_back);
//        if (pic != 0) {
//            iv_back.setImageResource(pic);
//        }
//    }

    @Override
    protected void onResume() {
        super.onResume();
        initData();
        // 在Activity中初始化P，并且连接V
//        presenter.attach((V) activity);

    }

//    @Override
//    public boolean dispatchTouchEvent(MotionEvent ev) {
//
//        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//            // 获得当前得到焦点的View，一般情况下就是EditText（特殊情况就是轨迹求或者实体案件会移动焦点）
//            View v = getCurrentFocus();
//            if (isShouldHideInput(v, ev)) {
//                v.clearFocus();
//                InputMethodManager imm = (InputMethodManager) this
//                        .getSystemService(Activity.INPUT_METHOD_SERVICE);
//                if (v != null) {
//                    if (imm.isActive()) {
//                        imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
//                    }
//                }
////                hideSoftInput(v.getWindowToken());
//            }
//        }
//
//        return super.dispatchTouchEvent(ev);
//    }


    /**
     * 根据EditText所在坐标和用户点击的坐标相对比，来判断是否隐藏键盘，因为当用户点击EditText时没必要隐藏
     *
     * @param v
     * @param event
     * @return
     */
//    private boolean isShouldHideInput(View v, MotionEvent event) {
//        if (v != null && (v instanceof EditText)) {
//            int[] l = {0, 0};
//            v.getLocationInWindow(l);
//            int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
//                    + v.getWidth();
//            if (event.getX() > left && event.getX() < right
//                    && event.getY() > top && event.getY() < bottom) {
//                // 点击EditText的事件，忽略它。
//                return false;
//            } else {
//                return true;
//            }
//        }
//        // 如果焦点不是EditText则忽略，这个发生在视图刚绘制完，第一个焦点不在EditView上，和用户用轨迹球选择其他的焦点
//        return false;
//    }
    private void initPermission() {
        AndPermission.with(this)
                .requestCode(100)
                .permission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .send();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
    }

    private PermissionListener listener = new PermissionListener() {
        @Override
        public void onSucceed(int requestCode, List<String> grantedPermissions) {
            // 权限申请成功回调。
            if (requestCode == 100) {
                //do nothing
            }
        }

        @Override
        public void onFailed(int requestCode, List<String> deniedPermissions) {
            // 权限申请失败回调。

            // 用户否勾选了不再提示并且拒绝了权限，那么提示用户到设置中授权。
            if (AndPermission.hasAlwaysDeniedPermission(BaseActivity.this, deniedPermissions)) {
                // 用自定义的提示语
                AndPermission.defaultSettingDialog(BaseActivity.this, 103)
                        .setTitle("权限申请失败")
                        .setMessage("我们需要的一些权限被您拒绝或者系统发生错误申请失败，请您到设置页面手动授权，否则功能无法正常使用！")
                        .setPositiveButton("好，去设置")
                        .show();
            }
        }
    };

}

